package project4;

/**
 * 编程题1
 * 一元二次方程求解器
 * ax² + bx + c = 0
 */
public class QuadraticEquation {
    // 方程系数
    private final double a;
    private final double b;
    private final double c;

    /**
     * 构造方法
     * @param a 二次项系数
     * @param b 一次项系数
     * @param c 常数项
     */
    public QuadraticEquation(double a, double b, double c) {
        // 二次项系数不能为0
        if (Math.abs(a) < 1e-6) {
            throw new IllegalArgumentException("系数a不能为0");
        }
        this.a = a;
        this.b = b;
        this.c = c;
    }

    /**
     * 计算判别式
     * @return 判别式的值
     */
    private double getDiscriminant() {
        return b * b - 4 * a * c;
    }

    /**
     * 判断是否有实数解
     * @return true表示有实数解，false表示无实数解
     */
    public boolean hasRealRoots() {
        return getDiscriminant() >= 0;
    }

    /**
     * 获取方程的解
     * @return 方程的解，如果无实数解返回null
     */
    public double[] solve() {
        double discriminant = getDiscriminant();

        // 无实数解
        if (discriminant < 0) {
            return null;
        }

        // 计算平方根
        double sqrtDiscriminant = Math.sqrt(discriminant);

        // 计算两个解
        double x1 = (-b + sqrtDiscriminant) / (2 * a);
        double x2 = (-b - sqrtDiscriminant) / (2 * a);

        // 返回结果
        return new double[]{x1, x2};
    }

    /**
     * 获取方程的字符串表示
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();

        // 二次项
        if (Math.abs(a - 1) < 1e-6) {
            sb.append("x²");
        } else if (Math.abs(a + 1) < 1e-6) {
            sb.append("-x²");
        } else {
            sb.append(a).append("x²");
        }

        // 一次项
        if (b > 0) {
            sb.append("+");
        }
        if (Math.abs(b - 1) < 1e-6) {
            sb.append("x");
        } else if (Math.abs(b + 1) < 1e-6) {
            sb.append("-x");
        } else if (Math.abs(b) >= 1e-6) {
            sb.append(b).append("x");
        }

        // 常数项
        if (c > 0) {
            sb.append("+");
        }
        if (Math.abs(c) >= 1e-6) {
            sb.append(c);
        }

        sb.append("=0");
        return sb.toString();
    }

    // 测试代码
    public static void main(String[] args) {
        // 测试用例1：x² + 2x + 1 = 0
        QuadraticEquation eq1 = new QuadraticEquation(1, 2, 1);
        System.out.println("方程1：" + eq1);
        if (eq1.hasRealRoots()) {
            double[] roots = eq1.solve();
            System.out.println("解：x1 = " + roots[0] + ", x2 = " + roots[1]);
        } else {
            System.out.println("无实数解");
        }

        // 测试用例2：x² - 4x + 4 = 0
        QuadraticEquation eq2 = new QuadraticEquation(1, -4, 4);
        System.out.println("\n方程2：" + eq2);
        if (eq2.hasRealRoots()) {
            double[] roots = eq2.solve();
            System.out.println("解：x1 = " + roots[0] + ", x2 = " + roots[1]);
        } else {
            System.out.println("无实数解");
        }

        // 测试用例3：x² + 1 = 0
        QuadraticEquation eq3 = new QuadraticEquation(1, 0, 1);
        System.out.println("\n方程3：" + eq3);
        if (eq3.hasRealRoots()) {
            double[] roots = eq3.solve();
            System.out.println("解：x1 = " + roots[0] + ", x2 = " + roots[1]);
        } else {
            System.out.println("无实数解");
        }
    }
}
